home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 2888 / 2888.xpi / content / bookmarkBatch.js < prev    next >
Text File  |  2008-06-29  |  13KB  |  391 lines

  1. /*
  2.  *Import/Export/Delete code
  3.  */
  4. var importing=false;
  5. var ffBkmks;
  6. var meter;
  7. function updateBookmark(index){
  8.     if (index==ffBkmks.length) {importComplete(); return;}
  9.     var percent=Math.floor(((index+1)/ffBkmks.length)*100);
  10.     meter.value=percent;
  11.     meterlabel.value=(index+1)+" / "+ffBkmks.length+" ("+percent+"%)";
  12.     var bm=ffBkmks[index];
  13.  
  14.     var req=GMS.com.getSendRequest();
  15.     req.send(GMS.com.getSendData(bm));
  16.     req.onreadystatechange = function(ev) {
  17.         if(req.readyState == 4) {
  18.             var status = -1;
  19.             try {status = req.status;}catch(e) {}
  20.             if(status == 200 || status==302) {
  21.                 updateBookmark(index+1);
  22.             }
  23.         }
  24.     }
  25. }
  26. function importFromFirefox(){
  27.     if (!GMS.checkSignedCookie()) {alert(strbundle.getString("signinFirst")); return;}
  28.     var aretheysure=confirm(strbundle.getString("confirmImport"));
  29.     if (!aretheysure) return;
  30.     importing=true;
  31.     document.getElementById("organize-statusbar").hidden=false;
  32.     document.getElementById("status-label").value=strbundle.getString("status-importing")+" ";//"Importing: ";
  33.     meter=document.getElementById('status-progress');
  34.     meter.value="0";
  35.     meterlabel=document.getElementById('progress-label');
  36.     meterlabel.value="";
  37.     var prefs = Components.classes["@mozilla.org/preferences-service;1"].
  38.                         getService(Components.interfaces.nsIPrefService).getBranch("gmarks.");
  39.     nestedChar=prefs.getCharPref("nestedChar");
  40.     ffBkmks=new Array();
  41.     //if (Components.classes["@mozilla.org/passwordmanager;1"]){
  42.     if (!Components.classes["@mozilla.org/fuel/application;1"]){
  43.     //if (!Components.classes["@mozilla.org/browser/nav-bookmarks-service;1"]){
  44.         importFF2();
  45.     }
  46.     else{
  47.         importFF3();
  48.     }
  49.     updateBookmark(0);
  50. }
  51. function importFF2(){
  52.     var RDF,BMDS,BMSVC,gNC_NS,gBmProperties;
  53.     RDF = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService);
  54.        BMDS  = RDF.GetDataSource("rdf:bookmarks");
  55.        BMSVC = BMDS.QueryInterface(Components.interfaces.nsIBookmarksService);
  56.     var NC = "http://home.netscape.com/NC-rdf#";
  57.  
  58.     var AllBookmarksResources = BMDS.GetAllResources();
  59.     var root="NC:BookmarksRoot";
  60.     var tmpSortBy=GMS.sortBy;
  61.     GMS.sortBy='title';
  62.     while (AllBookmarksResources.hasMoreElements()){
  63.         var res = AllBookmarksResources.getNext();
  64.         var name = getProperty(res, NC+"Name",RDF,BMDS);
  65.         var url = getProperty(res, NC+"URL",RDF,BMDS);
  66.         var description = getProperty(res, NC+"Description",RDF,BMDS);
  67.         var type = resolveType(res, RDF, BMDS);
  68.  
  69.         if (type!="Bookmark") continue;
  70.         var label="";
  71.         var isFolder=true;
  72.         var resParent= BMSVC.getParent(res);
  73.         var parent="";
  74.         if(resParent instanceof Components.interfaces.nsIRDFResource)
  75.             parent=resParent.QueryInterface(Components.interfaces.nsIRDFResource).Value;
  76.         while(resParent && parent!=root){
  77.             var parentName = getProperty(resParent, NC+"Name", RDF,BMDS);
  78.             var parentType = resolveType(resParent,RDF,BMDS);
  79.             if (parentType!="Folder"){
  80.                 isFolder=false;
  81.                 break;
  82.             }
  83.             if (label=="")
  84.                 label=parentName;
  85.             else
  86.                 label=parentName+nestedChar+label;
  87.             resParent= BMSVC.getParent(resParent);
  88.             parent="";
  89.             if(resParent instanceof Components.interfaces.nsIRDFResource)
  90.                 parent=resParent.QueryInterface(Components.interfaces.nsIRDFResource).Value;
  91.         }
  92.         if (!isFolder) continue;
  93.         addImportBookmark(url,name,label,description);
  94.     }
  95.     GMS.sortBy=tmpSortBy;
  96. }
  97. function importFF3(root,label){
  98.     var bmsvc = Components.classes["@mozilla.org/browser/nav-bookmarks-service;1"]
  99.                       .getService(Components.interfaces.nsINavBookmarksService);
  100.     var lsvc = Components.classes["@mozilla.org/browser/livemark-service;2"]
  101.                         .getService(Components.interfaces.nsILivemarkService);
  102.  
  103.     if (!root){
  104.         var roots = Application.bookmarks;
  105.     root = roots.children?roots:{children: [roots.menu,roots.toolbar,roots.unfiled]};
  106.     }
  107.     label=label?label:"";
  108.     root.children.forEach(function(bkmk,i,bookmarks){
  109.         if (bkmk.type=="bookmark"){
  110.             var desc="";
  111.             try{desc=bkmk.description}catch(e){}
  112.       var taggingSvc = Components.classes["@mozilla.org/browser/tagging-service;1"]
  113.                            .getService(Components.interfaces.nsITaggingService);
  114.       var tags = taggingSvc.getTagsForURI(bkmk.uri,{});
  115.       tags = tags.concat(label.split(/\s*,\s*/))
  116.             addImportBookmark(bkmk.uri.spec,bkmk.title,tags,desc);
  117.         }
  118.         else if (bkmk.type=="folder" && !lsvc.isLivemark(bkmk.id)){
  119.             var title="";
  120.             if (bkmk.id != bmsvc.bookmarksMenuFolder){
  121.                 if (label!="")
  122.                     title = label+nestedChar+bkmk.title;
  123.                 else
  124.                     title = bkmk.title;
  125.             } else {
  126.                 title = ""
  127.             }
  128.             importFF3(bkmk,title);
  129.         }
  130.     });
  131. }
  132. function addImportBookmark(url,name,label,description){
  133.     if (label==GMS.unlabeled) label="";
  134.     var bm=GMS.createNewBookmark(0,url,name,label!=""?[label]:[],description);
  135.     var idx=GMS.getBookmarkIndex(bm,ffBkmks);
  136.     if (idx>0 && idx<ffBkmks.length && ffBkmks[idx].url==url){//Already exists...
  137.         var hasLabel=false;
  138.         for (var i=0;i<ffBkmks[idx].labels.length && label!="";i++){
  139.             if (ffBkmks[idx].labels[i]==label){
  140.                 hasLabel=true;
  141.                 break;
  142.             }
  143.         }
  144.         if (hasLabel==false && label!=""){
  145.             ffBkmks[idx].labels.push(label);
  146.         }
  147.     }
  148.     else if (idx<0){
  149.         idx=-(idx+1);
  150.         ffBkmks.splice(idx,0,bm);
  151.     }
  152. }
  153. function importComplete(){
  154.     importing=false;
  155.     document.getElementById("organize-statusbar").hidden=true;
  156.     //meter.setAttribute('hidden','true');
  157.     //document.getElementById('importProgress').setAttribute('hidden','true');
  158.     //document.getElementById("importButton").setAttribute("hidden","false");
  159.     GMS.getBookmarksFeed('refresh',true);
  160.     alert(strbundle.getString("importComplete"));
  161. }
  162. /////////////////////////////////////////////////////////////////////////////
  163. // returns the literal targeted by the URI aArcURI for a resource or uri
  164. function getProperty(aInput, aArcURI, RDF,BMDS)
  165. {
  166.     var node;
  167.     var arc  = RDF.GetResource(aArcURI);
  168.     if (typeof(aInput) == "string") {
  169.         aInput = RDF.GetResource(aInput);
  170.     }
  171.  
  172.     node = BMDS.GetTarget(aInput, arc, true);
  173.  
  174.     try {
  175.         return node.QueryInterface(Components.interfaces.nsIRDFResource).Value;
  176.     }
  177.     catch (e) {
  178.         return node? node.QueryInterface(Components.interfaces.nsIRDFLiteral).Value : "";
  179.     }
  180. }
  181. ////////////////////////////////////////////////////////////////////////////
  182. // Determine the rdf:type property for the given resource.
  183. function resolveType(aResource,RDF,BMDS)
  184. {
  185.     var type = getProperty(aResource,"http://www.w3.org/1999/02/22-rdf-syntax-ns#type",RDF,BMDS);
  186.     if (type != "")
  187.         type = type.split("#")[1];
  188.  
  189.     if (type=="")
  190.         type="Immutable";
  191.     return type;
  192. }
  193.  
  194. function exportFromGoogle(){
  195.     if (!GMS.checkSignedCookie()) {alert(strbundle.getString("signinFirst")); return;}
  196.     exportBookmarks();
  197. }
  198. /*
  199.  * <DT><A HREF="url" ADD_DATE="1141505816" LAST_VISIT="1141505816" ICON="" LAST_CHARSET="" TAGS="delicious style tags">Title</A>
  200.  * <DD>Description
  201.  */
  202.  
  203. function exportBookmarks (){
  204.     try {
  205.       var kFilePickerContractID = "@mozilla.org/filepicker;1";
  206.       var kFilePickerIID = Components.interfaces.nsIFilePicker;
  207.       var kFilePicker = Components.classes[kFilePickerContractID].createInstance(kFilePickerIID);
  208.  
  209.       var kTitle = strbundle.getString("exportTitle");
  210.       kFilePicker.init(window, kTitle, kFilePickerIID["modeSave"]);
  211.       kFilePicker.appendFilters(kFilePickerIID.filterHTML | kFilePickerIID.filterAll);
  212.       kFilePicker.defaultString = "bookmarks.html";
  213.       var fileName;
  214.       if (kFilePicker.show() != kFilePickerIID.returnCancel) {
  215.         fileName = kFilePicker.file.path;
  216.         if (!fileName) return;
  217.       }
  218.       else return;
  219.  
  220.       var file = Components.classes["@mozilla.org/file/local;1"]
  221.                            .createInstance(Components.interfaces.nsILocalFile);
  222.       if (!file)
  223.         return;
  224.       file.initWithPath(fileName);
  225.       if (!file.exists()) {
  226.         file.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0644);
  227.       }
  228.     }
  229.     catch (e) {
  230.       return;
  231.     }
  232.     var outputStream = Components.classes["@mozilla.org/network/file-output-stream;1"]
  233.         .createInstance( Components.interfaces.nsIFileOutputStream );
  234.     var charset = "UTF-8";
  235.     outputStream.init( file, 0x02 | 0x08 | 0x20, 420, 0 );
  236.     var output = doFolderExport();//document.getElementById('blog').value;
  237.  
  238.     var cos = Components.classes["@mozilla.org/intl/converter-output-stream;1"]
  239.         .createInstance(Components.interfaces.nsIConverterOutputStream);
  240.     cos.init(outputStream, charset, 4096, "?".charCodeAt(0));
  241.     cos.writeString(output);
  242.     cos.flush();
  243.     cos.close();
  244.     outputStream.close();
  245. }
  246. function doFolderExport(){
  247.     var body=
  248.         '<!DOCTYPE NETSCAPE-Bookmark-file-1>\r\n'+
  249.         '<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">\r\n'+
  250.         '<!-- This is an automatically generated file.'+
  251.         'It will be read and overwritten.'+
  252.         'Do Not Edit! -->\r\n'+
  253.         '<TITLE>Bookmarks</TITLE>\r\n'+
  254.         '<H1>Bookmarks</H1>\r\n'+
  255.         '<DL><p>\r\n';
  256.  
  257.     //Put into a folder like structure...
  258.     var treeData=getVisibleData();
  259.     body+=writeData(treeData,0);
  260.     //dump("write data calls: "+calls);
  261.     body+="</p></DL>";
  262.  
  263.     //document.getElementById('exportProgress').setAttribute('hidden','true');
  264.     //document.getElementById("exportButton").setAttribute("hidden","false");
  265.  
  266.     return body;
  267. }
  268.  
  269. function writeData(treeData,tab){
  270.     var body="";
  271.     //calls++;
  272.     for (var i=0;i<treeData.length;i++){
  273.         if (treeData[i].type==0){//Its a label/folder}
  274.             body+=getTab(tab)+'<DT><H3 LAST_MODIFIED="'+treeData[i].date.getTime()+'">'+treeData[i].title+"</H3>\r\n";
  275.             body+=getTab(tab)+"<DL><p>\r\n";
  276.             body+=writeData(treeData[i].data,tab+1);
  277.             body+=getTab(tab)+"</p></DL><p>\r\n";
  278.         }
  279.         else{
  280.             var bkmk=treeData[i];
  281.             var title=bkmk.title.replace('"','"').replace("'",''');
  282.             var icon="";
  283.             var pos=bkmk.notes.indexOf("data:image");
  284.             if (pos>-1){
  285.                 icon=bkmk.notes.substring(pos);
  286.                 if (pos>0) bkmk.notes=bkmk.notes.substring(0,pos);
  287.             }
  288.             body+=getTab(tab)+'<DT><A HREF="'+bkmk.url+'" ADD_DATE="'+bkmk.date.getTime()+'" LAST_VISIT="'+bkmk.date.getTime()+'" ICON="'+icon+'" LAST_CHARSET="">'+
  289.                     title+"</A>\r\n";
  290.             if (bkmk.notes!=null && bkmk.notes.length>0){
  291.                 body+=getTab(tab)+"<DD>"+bkmk.notes+"\r\n";
  292.             }
  293.         }
  294.     }
  295.     return body;
  296. }
  297.  
  298. function getTab(tab){
  299.     var s="";
  300.     for (var i=0;i<tab;i++){
  301.         s+="    ";
  302.     }
  303.     return s;
  304. }
  305.  
  306. function doTagsExport(){
  307.     //dump("doTagsExport\n");
  308.     var body='document.writeln("'+
  309.         '<!DOCTYPE NETSCAPE-Bookmark-file-1>'+
  310.         "<META HTTP-EQUIV='Content-Type' CONTENT='text/html; charset=UTF-8'>"+
  311.         '<!-- This is an automatically generated file.'+
  312.         'It will be read and overwritten.'+
  313.         'Do Not Edit! -->'+
  314.         '<TITLE>Bookmarks</TITLE>'+
  315.         '<H1>Bookmarks</H1>'+
  316.         '<DL><p>");';
  317.  
  318.  
  319.     for (var i=0;i<GMS.bookmarkArray.length;i++){
  320.         var bkmk=GMS.bookmarkArray[i];
  321.         body+="document.writeln('"+'<DT><A HREF="'+bkmk.url.replace("'",'"')+'" ADD_DATE="'+bkmk.date+'" LAST_VISIT="'+bkmk.date+'" ICON="" LAST_CHARSET="" TAGS="'+bkmk.labels.toString().replace("'",'"')+'">'+bkmk.title.replace("'",'"')+"</A>');";
  322.         if (bkmk.notes!=null && bkmk.notes.length>0){
  323.             body+="document.writeln('<DD>"+bkmk.notes.replace("'",'"')+"');";
  324.         }
  325.     }
  326.     body+="document.write('</DL></p>');";
  327.     body+="document.close();";
  328.  
  329.     document.getElementById('exportProgress').setAttribute('hidden','true');
  330.     document.getElementById("exportButton").setAttribute("hidden","false");
  331.  
  332.     var sOption="toolbar=yes,location=no,directories=yes,menubar=yes,scrollbars=yes";
  333.     var w=window.open('javascript: '+body,"",sOption);
  334. }
  335.  
  336. function deleteFromGoogle(){
  337.     if (!GMS.checkSignedCookie()) {alert(strbundle.getString("signinFirst")); return;}
  338.     if (!confirm(strbundle.getString("confirmDelete"))) return;
  339.     document.getElementById("organize-statusbar").hidden=false;
  340.     document.getElementById("status-label").value=strbundle.getString("status-deleting")+" ";
  341.     meter=document.getElementById('status-progress');
  342.     meter.value="0%";
  343.     meterlabel=document.getElementById('progress-label');
  344.     meterlabel.value="";
  345.  
  346.     doDelete();
  347. }
  348.  
  349. function doDelete(index){
  350.     if (!index){
  351.         index=0;
  352.     }
  353.     if (index==GMS.bookmarkArray.length) {deleteComplete(); return;}
  354.     //dump("index="+index);
  355.     var percent=Math.floor(((index+1)/GMS.bookmarkArray.length)*100);
  356.     meter.value=percent;
  357.     meterlabel.value=(index+1)+" / "+GMS.bookmarkArray.length+" ("+percent+"%)";
  358.     var req = GMS.com.getRemoveRequest();
  359.     req.send(GMS.com.getRemoveData(GMS.bookmarkArray[index]));
  360.     req.onreadystatechange = function(ev) {
  361.         if(req.readyState == 4) {
  362.             var status = -1;
  363.             try {status = req.status;}catch(e) {}
  364.             if(status == 200 || status==302) {
  365.                 doDelete(index+1);
  366.             }
  367.             else{
  368.                 deleteComplete()
  369.             }
  370.         }
  371.     }
  372. }
  373.  
  374. function deleteComplete(){
  375.     deleting=false;
  376.     document.getElementById("organize-statusbar").hidden=true;
  377.     GMS.getBookmarksFeed('refresh',true);
  378.     alert(strbundle.getString("deleteComplete"));
  379.  
  380.     GMS.doCommand("refresh");
  381. }
  382. function editFilters(){
  383.     window.open("chrome://gmarks/content/editFilters.xul","","chrome,centerscreen,resizable");
  384. }
  385. function debug(msg){
  386.     /*var consoleService = Components.classes["@mozilla.org/consoleservice;1"]
  387.             .getService(Components.interfaces.nsIConsoleService);
  388.       consoleService.logStringMessage(msg);
  389.       /**/
  390. }
  391.